package net.ufrog.common.jetbrick;

import jetbrick.template.JetAnnotations;
import net.ufrog.common.utils.Calendars;
import net.ufrog.common.utils.Numbers;
import net.ufrog.common.utils.Strings;

import java.util.Date;
import java.util.stream.IntStream;

/**
 * @author ultrafrog
 * @version 1.0, 2014-10-04
 * @since 1.0
 */
@JetAnnotations.Methods
public class Methods {

    /**
     * 格式化成货币字符串
     *
     * @param value 金额
     * @return 货币字符串
     */
    public static String currency(Number value) {
        return currency(value, Numbers.currency(0));
    }

    /**
     * 格式化成货币字符串
     *
     * @param value 金额
     * @param defaultValue 默认金额
     * @return 货币字符串
     */
    public static String currency(Number value, String defaultValue) {
        if (value == null) return defaultValue;
        return Numbers.currency(value);
    }

    /**
     * 格式化成百分比
     *
     * @param value 数字
     * @return 百分比字符串
     */
    public static String percent(Number value) {
        return percent(value, Numbers.percent(0));
    }

    /**
     * 格式化成百分比
     *
     * @param value 数字
     * @param defaultValue 默认数字
     * @return 百分比字符串
     */
    public static String percent(Number value, String defaultValue) {
        if (value == null) return defaultValue;
        return Numbers.percent(value);
    }

    /**
     * 格式化日期
     *
     * @param date 日期
     * @return 日期字符串
     */
    public static String date(Date date) {
        return date(date, "-");
    }

    /**
     * 格式化日期
     *
     * @param date 日期
     * @param defaultValue 默认日期
     * @return 日期字符串
     */
    public static String date(Date date, String defaultValue) {
        if (date == null) return defaultValue;
        return Calendars.date(date);
    }

    /**
     * 格式化时间
     *
     * @param date 时间
     * @return 时间字符串
     */
    public static String time(Date date) {
        return time(date, "-");
    }

    /**
     * 格式化时间
     *
     * @param date 时间
     * @param defaultValue 默认时间
     * @return 时间字符串
     */
    public static String time(Date date, String defaultValue) {
        if (date == null) return defaultValue;
        return Calendars.time(date);
    }

    /**
     * 格式化时间
     *
     * @param date 时间
     * @return 时间字符串
     */
    public static String datetime(Date date) {
        return datetime(date, "-");
    }

    /**
     * 格式化时间
     *
     * @param date 时间
     * @param defaultValue 默认时间
     * @return 时间字符串
     */
    public static String datetime(Date date, String defaultValue) {
        if (date == null) return defaultValue;
        return Calendars.datetime(date);
    }

    /**
     * 截断字符串
     *
     * @param value 字符串
     * @param len 长度
     * @return 截断后的字符串
     */
    public static String truncate(String value, Integer len) {
        return truncate(value, len, "...");
    }

    /**
     * 截断字符串
     *
     * @param value 字符串
     * @param len 长度
     * @param suffix 后缀
     * @return 截断后的字符串
     */
    public static String truncate(String value, Integer len, String suffix) {
        return Strings.truncate(value, len, suffix);
    }

    /**
     * 判断字符串是否则数组中
     *
     * @param value 字符串
     * @param array 数组
     * @return 判断结果
     */
    public static Boolean in(String value, String... array) {
        return Strings.in(value, array);
    }

    /**
     * 驼峰命名
     *
     * @param value 字符串
     * @param regex 间隔符
     * @param from 起始字符串
     * @return 处理后字符串
     */
    public static String camelCase(String value, String regex, Integer from) {
        StringBuilder name = new StringBuilder();
        String[] names = value.split(regex);
        IntStream.range(from, names.length).forEach(idx -> name.append(Strings.toTitleCase(names[idx].toLowerCase())));
        return Strings.toLowerTitleCase(name.toString());
    }

    /**
     * 首字母大写
     *
     * @param value 字符串
     * @return 处理后字符串
     */
    public static String titleCase(String value) {
        return Strings.toTitleCase(value);
    }

    /**
     * 判断是否为空
     *
     * @param value 字符串
     * @return 判断结果
     */
    public static Boolean empty(String value) {
        return Strings.empty(value);
    }
}
